<?php
class SP_Common_Functions
{
	//разбивает строку типа oneTwoThree => array('one','two','three')
	public static function splitCamelCase($string, $lower = true)
	{
	  $array = preg_split('/([A-Z][^A-Z]*)/', $string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
	  if ($lower) 
	  {
		$array = array_map(strtolower, $array);
	  }
	  return $array;
	}
	
	//разбивает строку типа one/two/three => array('one','two','three')
	public static function splitSlashes($value, $lower = true)
	{
		$array = preg_split('/\//',$value,-1,PREG_SPLIT_NO_EMPTY);
		if ($lower) 
		{
			$array = array_map(strtolower, $array);
		}
		return $array;
	}

	//преобразует число к денежному виду 5 => 5.00
	public static function toMoneyFormat($float)
	{
		return sprintf("%01.2f",$float);
	}
	
	//деление нацело 11/3=3
	public static function div($x, $y)
	{
		if ($y == 0) return false;
		return ($x - ($x % $y)) / $y;
	}
	
	//применяет функциию stripslashes к массиву
	public static function stripSlashesDeep($value)
	{
		$value = is_array($value) ?	array_map(array('SP_Common_Functions', 'stripSlashesDeep'), $value) : stripslashes($value);
		return $value;
	}

	//удаляет последние $len символов из строки
	public static function delLastChar($str,$len=1)
	{
		return substr($str, 0, -$len);
	}
	
	/*
	склеивает массив в строку
	$glue - разделитель между элементами,
	$outer - символы окружающие элемент,
	$keys - использует не значение а ключи массива
	*/
	public static function arrayToString($array, $glue=',', $outer='',$keys=false)
	{
		if(is_array($array))
		{
			if ($keys) $array=array_keys($array);
			if($outer=='')
			{
				return implode($glue,$array);
			}
			else
			{
				if(is_array($outer))
				{
					foreach($array as $value)
					{
						$str=$str.$outer[0].$value.$outer[1].$glue;
					}
				}
				else
				{
					foreach($array as $value)
					{
						$str=$str.$outer.$value.$outer.$glue;
					}
				}
				return self::delLastChar($str,strlen($glue));
			}
		}
		else
		{
			return $array;
		}
	}
	
	/*
	преобразует элементы массива в ассоциативный, например,
	array('id','3','id2','4') превратится в
	array('id' => '3','id2' => '4')
	*/
	public static function arrayToAssocArray($array)
	{
		$count=count($array);
		if( $count==0 ) return $array();
		$array=array_values($array);
		if( $count%2 != 0) $count++;
		$iters=$count/2;
		for ($i=0; $i<=$iters-1; $i++)
		{
			$out[$array[$i*2]]=$array[$i*2 + 1];
		}
		return $out;
	}
	
	//удаляет из массива $array элементы с ключами, совпадающими с элементами массива $key_array
	public static function arrayRemoveKeys($array,$key_array)
	{
		if(is_array($key_array) && count($key_array)>0)
		{
			$tmp_array=array_combine($key_array,range(1,count($key_array)));
			return array_diff_key($array,$tmp_array);
		}
		return $array;
	}
	
	/* 
	возвращает массив случайно выбраных элементов исходного массива $array с учетом весов $weights
	порядок элементов исходного массива сохраняется,
	исходный массив и массив весов должные иметь одинаковые числовые индексы
	*/
	public static function arrayRandWeights($array, $weights, $count=1)
	{
		$upper_bound=0;
		$first_weight=$weights[0];
		$equal_weights=1;
		foreach($weights as $weight)
		{
			$equal_weights *= ($first_weight==$weight);
			$upper_bound += $weight;
			$intervals[]=$upper_bound;
		}

		if( $equal_weights )
		{
			$rand_keys=array_rand($array, $count);
			$rand_keys=array_combine(array_values($rand_keys), $rand_keys);
		}
		else
		{
			for($i=0; $i<$count; $i++)
			{
				$rand_val=mt_rand(1, $upper_bound);
				$found=false;
				foreach($intervals as $key => $value)
				{
					if( $found )
					{
						$intervals[$key]-=$found_weight;
					}
					elseif( $rand_val <= $value )
					{
						$found_key=$key;
						$rand_keys[$key]=1;
						$found=true;
						$found_weight=$weights[$key];
						$upper_bound-=$found_weight;
					}
				}
				unset($intervals[$found_key]);
			}
		}
		
		$out=array_intersect_key($array, $rand_keys);
		return $out;
	}
	
	//проверяет содержит ли массив $array элементы только объекты класса $class
	public static function arrayHasOnlyClass($array,$class)
	{
		foreach($array as $object)
		{
			if( get_class($object)!=$class ) return false;
		}
		return true;
	}

	public static function rmDir($dir)
	{
		if (is_dir($dir))
		{
			$objects = scandir($dir);
			foreach ($objects as $object)
			{
				if ($object != "." && $object != "..")
				{
					if (filetype($dir."/".$object) == "dir") 
						self::rmDir($dir."/".$object); 
					else 
						unlink($dir."/".$object);
				}
			}
			reset($objects);
			rmdir($dir);
		}
	}

	public static function copyDir( $source, $destination )
	{
		if ( is_dir( $source ) )
		{
			@mkdir( $destination );
			$directory = dir( $source );
			while ( FALSE !== ( $readdirectory = $directory->read() ) )
			{
				if ( $readdirectory == '.' || $readdirectory == '..' )
				{
					continue;
				}
				$PathDir = $source . '/' . $readdirectory; 
				if ( is_dir( $PathDir ) )
				{
					copy_directory( $PathDir, $destination . '/' . $readdirectory );
					continue;
				}
				copy( $PathDir, $destination . '/' . $readdirectory );
			}
	 
			$directory->close();
		}
		else
		{
			copy( $source, $destination );
		}
	}
	
	public static function getServerName($with_http=true)
	{
		if( $with_http ) $http='http://';
		return $http.$_SERVER['SERVER_NAME'];
	}
	
	public static function cutLongPhrase($phrase, $max_words=5, $cut_words=3)
	{
		$words=explode(' ', $phrase);
		if( count($words)>$max_words )
		{
			$out = implode(' ', array_slice($words, 0, $cut_words) ).'&#133;';
		}
		else
		{
			$out=$phrase;
		}
		return $out;
	}
	
	public static function addFirstSlash($link)
	{
		if( strpos($link, '/')===0 )
		{
			$out=$link;
		}
		else
		{
			$out='/'.$link;
		}
	}
	
	public static function getAbsoluteLink($link, $add_host=false, $https=false)
	{
		if( !$link ) return false;
		$http = $https? 'https://' : 'http://';
		$host = $_SERVER['HTTP_HOST'];
		$out=$link;
		if( strpos($link, $http)===false )
		{
			
			if( $add_host and strpos($link, $host)===false )
			{
				$out=$http.$host.self::addFirstSlash($link);
			}
			else
			{
				$out=$http.$link;
			}
		}
		return $out;
	}
}